package com.coolingme.f01_simplefactory.factory;

import com.coolingme.f01_simplefactory.ICourse;
import com.coolingme.f01_simplefactory.JavaCourse;
import com.coolingme.f01_simplefactory.PythonCourse;

/**
 * 简单工厂，创建课程对象
 *
 * @author wangyue
 * @date 2020/9/16 14:37
 */
public class CourseFactory {

    /**
     * 创建课程对象,如果要增加业务，会修改代码逻辑。不符合开闭原则
     *
     * @param courseName 课程名
     * @return ICourse
     */
    public static ICourse create1(String courseName) {
        if ("java".equals(courseName)) {
            return new JavaCourse();
        } else if ("python".equals(courseName)) {
            return new PythonCourse();
        } else {
            return null;
        }
    }

    /**
     * 采用反射的方式，字符串有可能会出错，且需要强制转型
     *
     * @param className 类的全路径名
     * @return ICourse
     */
    public static ICourse create2(String className) {
        if (className == null || "".equals(className)) {
            return null;
        }
        ICourse course = null;
        try {
            course = (ICourse) Class.forName(className).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return course;
    }

    /**
     * 采用反射的方式2，规定只有继承ICourse
     *
     * @param clazz 类对象
     * @return ICourse
     */
    public static ICourse create3(Class<? extends ICourse> clazz) {
        try {
            if (clazz != null) {
                return clazz.newInstance();
            }
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }

}